# @Time:2018.7.20
# @Author:menxging

import pymysql
import re
import json
import requests
from lxml import etree
from core500_words import CORE500WORDS


class SpiderIciba(object):
    """
    爬取http://www.iciba.com 上的单词数据
    目标数据：1）word 单词； 2)soundmark 音标； 3）trans 翻译； 4）part_of_speech 词性； 5)example_sentense 例句
    6）USA_pronunciation 美式发音； 7）UK_pronunciation 英式发音； 8）word_root_or_affix 词根/词缀;
    9) synonymy 近义词； 10)antonym 反义词
    """

    def __init__(self):
        """
        初始化爬虫参数
        :return:
        """
        self.base_url = 'http://dict.youdao.com/search?q='
        self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"}

    def run_spider(self, word):
        """
        爬取数据
        :return:
        """
        # 需要爬取的单词
        # 完整url
        url = self.base_url + word
        # 返回结果
        response = requests.get(url=url, headers=self.headers)

        return response.content

    def parse_data(self, response):
        """
        分析数据，摘取目标数据
        :return:data_dict
        """
        # 使用xpath进行数据解析
        # 解析网页内容
        html = etree.HTML(response)
        # 格式化输出
        # html_str = etree.tostring(html, pretty_print=True)
        # print(html_str)

        # 抽取出相应的字段
        # 1) 单词
        word = html.xpath('//*[@id="phrsListTab"]/h2/span')[0].text.strip()
        print(word)
        #
        # # 2）音标
        soundmark_USA = html.xpath('//*[@id="phrsListTab"]/h2/div/span[2]/span')[0].text.strip()
        # print(soundmark_USA)
        soundmark_UK = html.xpath('//*[@id="phrsListTab"]/h2/div/span[1]/span')[0].text.strip()
        # print(soundmark_UK)
        soundmark = '美:'+soundmark_USA+';'+'英：'+soundmark_UK
        print(soundmark)

        # 3) 翻译
        # trans =[item.text for item in html.xpath('//*[@id="phrsListTab"]/div[2]/ul')]
        # trans = html.xpath('//*[@id="phrsListTab"]/div[2]/ul/li')
        # print(trans)

        # # 4）词性
        # part_of_speech = ';'.join([item.get_text() for item in soup.select('li[class="clearfix"] span[class=prop]')])
        # print(part_of_speech)

        # 5) 例句
        example_sentense ='\n'.join([item.text for item in html.xpath('//*[@id="collinsResult"]/div/div/div/div/ul/li[1]/div[2]/div/p')])
        print("例句："+example_sentense)

        # 6) 美式发音
        # 使用正则过滤出发音的链接
        # USA_pronunciation = html.xpath('//*[@id="phrsListTab"]/h2/div/span[2]/a/@href')[0]
        # print("美式发音："+USA_pronunciation)

        # 7）UK_pronunciation 英式发音
        # UK_pronunciation = html.xpath('//*[@id="phrsListTab"]/h2/div/span[1]/a/@href')[0]
        # print("英式发音:"+UK_pronunciation)

        # # 8）word_root_or_affix 词根/词缀
        # word_root_or_affix = html.xpath('//*[@id="relWordTab"]/p[1]/span')[0].text
        # print(word_root_or_affix)

        # 9) synonymy 同近义词
        # synonymy = html.xpath('//*[@id="synonyms"]/ul')
        # print('同近义词：')

        # # 10) antonym 反义词
        # qwwqwqwqwwqwqwqwqwqwqwqwqwqw

        # # 返回目标数据的字典形式
        # data_dict = {}
        # return data_dict

    # def save_data(self, data_dict):
    #     """
    #     将数据存储到mysql中
    #     :return:
    #     """
    #     # 使用pymysql进行对数据库的交互
    #     # 创建连接
    #     db = pymysql.connect('localhost', 'root', 'mysql', 'test_1')
    #     # 创建cursor游标
    #     cursor = db.cursor()
    #     # sql 语句
    #     sql = """INSERT INTO TABLE test_1 () VALUES ()"""
    #     # 使用excute方法执行sql语句
    #     try:
    #         cursor.execute(sql)
    #         # 提交
    #         cursor.commit()
    #     except:
    #         # 发生错误则回滚
    #         db.rollback()
    #     # 关闭数据库连接
    #     db.close()

    def start_spider(self):
        """
        主逻辑
        :return:
        """
        # 遍历所有单词，进行数据爬取
        for word in CORE500WORDS:
            print('--'*20)
            print(word)
            # 爬取数据
            response = self.run_spider(word)
            try:
                # 分析数据
                self.parse_data(response)
            except:
                pass
            # 存储数据
            # self.save_data(data_dict)


if __name__ == '__main__':
    # 实例化爬虫对象
    spider_iciba = SpiderIciba()
    # 开始
    spider_iciba.start_spider()
